/**
 * <h3>SchoolController</h3>
 * <p>学校信息管理控制器类</p>
 *
 * <h3>功能描述</h3>
 * <p>提供学校信息的增删改查等基础操作接口，统一返回AjaxResult格式结果</p>
 * <p>支持学校的创建、编辑、删除、查询等核心功能，包含分页查询、校徽收录、统计信息等</p>
 * <p>所有接口均基于RESTful风格设计，配合SpringMVC与Swagger注解实现标准化API输出</p>
 *
 * <h3>元数据</h3>
 * <ul>
 *    <li>作者：郭强</li>
 *    <li>创建日期：2020年05月07日 21:09:09</li>
 * </ul>
 *
 * <h3>其他信息</h3>
 * <ul>
 *    <li>参考链接：<a href="https://fantastic-admin.hurui.me/guide/permission.html">权限控制文档</a></li>
 *    <li>示例代码：{@code new SchoolController(schoolService)} </li>
 * </ul>
 *
 * @apiNote 接口需结合前端权限配置使用，确保安全性；当前部分接口已启用权限注解
 * @implSpec 继承自 {@link BaseController}，复用分页、返回封装等通用逻辑
 * @since 1.0.0
 */

package com.dnndo.web.controller.system;


import com.dnndo.common.annotation.Log;
import com.dnndo.common.core.controller.BaseController;
import com.dnndo.common.core.domain.AjaxResult;
import com.dnndo.common.core.domain.PageResult;
import com.dnndo.common.core.domain.R;
import com.dnndo.common.core.page.TableSupport;
import com.dnndo.common.enums.BusinessType;
import com.dnndo.common.utils.ServletUtils;
import com.dnndo.common.utils.bean.BeanDtoVoUtil;
import com.dnndo.system.domain.School;
import com.dnndo.system.domain.dto.ApiSchoolDTO;
import com.dnndo.system.domain.dto.SchoolDTO;
import com.dnndo.system.domain.dto.SchoolOfficialDTO;
import com.dnndo.system.domain.vo.*;
import com.dnndo.system.service.ISchoolService;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.ApiParam;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;

/**
 * 学校信息controller类
 *
 * @author 郭强
 *
 */
@RestController
@RequestMapping("/system/school")
public class schoolController extends BaseController {


    private final ISchoolService schoolService;

    @Autowired
    public schoolController(ISchoolService schoolService) {
        this.schoolService = schoolService;
    }

    /**
     * 查询学校列表（分页）
     * @param dto 学校查询条件封装对象，包含学校名称、类型、省份等过滤条件
     * @return PageResult<SchoolVO> 分页后的学校信息列表及总记录数
     * @see com.dnndo.system.domain.vo.SchoolVO
     */
    @PreAuthorize("@ss.hasPermi('system:school:list')")
    @GetMapping("/list")
    public PageResult<SchoolVO> list(SchoolDTO dto) {
        startPage();
        List<School> list = schoolService.selectSchoolList(dto);
        return PageResult.pageOk(BeanDtoVoUtil.listVo(list, SchoolVO.class), new PageInfo<>(list).getTotal());
    }

    /**
     * 查询学校logo列表（分页）
     * @param dto 学校查询条件封装对象，包含学校名称、类型、省份等过滤条件
     * @return PageResult<SchoolVO> 分页后的学校logo信息列表及总记录数
     * @see com.dnndo.system.domain.vo.SchoolVO
     */
    @PreAuthorize("@ss.hasPermi('system:logo:list')")
    @GetMapping("/logolist")
    public PageResult<SchoolVO> logolist(SchoolDTO dto) {
        startPage();
        List<School> list = schoolService.selectSchoolLogoList(dto);
        return PageResult.pageOk(BeanDtoVoUtil.listVo(list, SchoolVO.class), new PageInfo<>(list).getTotal());
    }

    /**
     * 查询全部学校名称
     * @param dto 学校查询条件封装对象，包含学校名称、类型、省份等过滤条件
     * @return AjaxResult 包含学校名称列表的响应结果
     * @see com.dnndo.system.domain.vo.SchoolVO
     */
    @GetMapping("/SchoolNamelist")
    public AjaxResult SchoolNamelist(SchoolDTO dto) {
        List<School> list = schoolService.selectSchoolNameList(dto);
        return AjaxResult.success(BeanDtoVoUtil.listVo(list, SchoolVO.class));
    }

    /**
     * 根据学校ID获取详细信息
     * @param schoolId 学校唯一标识符
     * @return AjaxResult 包含学校详细信息的响应结果
     * @see com.dnndo.system.domain.vo.SchoolVO
     */
    @PreAuthorize("@ss.hasPermi('system:school:getInfo')")
    @GetMapping("/getInfo")
    public AjaxResult getInfo(@ApiParam(value = "学校ID", required = true) Long schoolId) {
        SchoolDTO school = schoolService.selectSchoolListById(schoolId);
        return AjaxResult.success(R.ok(BeanDtoVoUtil.convert(school, SchoolVO.class)));
    }

    /**
     * 新增学校信息
     * @param dto 前端传入的学校数据传输对象，包含新增字段
     * @return AjaxResult 操作结果返回对象，包含成功或失败状态
     * @see com.dnndo.system.domain.dto.SchoolDTO
     */
    @PreAuthorize("@ss.hasPermi('system:school:add')")
    @Log(title = "学校管理", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@Validated @RequestBody SchoolDTO dto) {
        return toAjax(schoolService.insertSchool(dto));
    }

    /**
     * 修改已有学校信息
     * @param dto 前端传入的学校数据传输对象，包含更新字段
     * @return AjaxResult 操作结果返回对象，包含成功或失败状态
     * @see com.dnndo.system.domain.dto.SchoolDTO
     */
    @PreAuthorize("@ss.hasPermi('system:school:edit')")
    @Log(title = "学校管理", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
    public AjaxResult edit(@Validated @RequestBody SchoolDTO dto)
    {
        SchoolDTO schoolDTO = BeanDtoVoUtil.convert(dto, SchoolDTO.class);
        return toAjax(schoolService.updateSchoolById(schoolDTO));
    }

    /**
     * 删除指定ID的学校信息
     * @param schoolId 要删除的学校唯一标识符
     * @return AjaxResult 操作结果返回对象，包含成功或失败状态
     * @see com.dnndo.system.domain.dto.SchoolDTO
     */
    @PreAuthorize("@ss.hasPermi('system:school:del')")
    @Log(title = "学校管理", businessType = BusinessType.DELETE)
    @GetMapping("/del")
    public AjaxResult del(@ApiParam(value = "学校ID",required = true) Integer schoolId)
    {
        return toAjax(schoolService.deleteSchoolById(schoolId));
    }

    /**
     * 下架指定ID的学校信息
     * @param schoolId 要下架的学校唯一标识符
     * @return AjaxResult 操作结果返回对象，包含成功或失败状态
     * @see com.dnndo.system.domain.dto.SchoolDTO
     */
    @PreAuthorize("@ss.hasPermi('system:school:down')")
    @Log(title = "学校管理", businessType = BusinessType.DELETE)
    @GetMapping("/down")
    public AjaxResult down(@ApiParam(value = "学校ID",required = true) Integer schoolId)
    {
        return toAjax(schoolService.downSchoolById(schoolId));
    }

    /**
     * 获取学校特征信息
     * @param language 语言类型（zh/en）
     * @return AjaxResult 包含学校特征信息的响应结果
     * @see com.dnndo.system.domain.dto.SchoolDTO
     */
    @GetMapping("/get/school_related")
    public AjaxResult getSchoolRelatedInfo(@RequestParam String language) {
        return AjaxResult.success(schoolService.getSchoolRelatedInfo(language));
    }

    /**
     * 获取省份城市信息
     * @param language 语言类型（zh/en）
     * @return AjaxResult 包含省份城市列表的响应结果
     * @see com.dnndo.system.domain.vo.ProvinceVO
     */
    @GetMapping("/get/province_city")
    public AjaxResult getProvinceCity(@RequestParam String language) {
        // 使用BeanDtoVoUtil进行转换
        List<ProvinceVO> provinceVOList = BeanDtoVoUtil.listVo(schoolService.getProvinceCityListDTO(language), ProvinceVO.class);
        return AjaxResult.success(provinceVOList);
    }

    /**
     * 校徽收录统计
     * @return AjaxResult 包含校徽收录统计信息的响应结果
     * @see com.dnndo.system.domain.vo.SchoolStatisticsVO
     */
    @GetMapping("/school_enblem_statistics")
    public AjaxResult getSchoolStatistics() {
        SchoolStatisticsVO provinceVOList = BeanDtoVoUtil.convert(schoolService.getSchoolStatistics(), SchoolStatisticsVO.class);
        return AjaxResult.success(provinceVOList);
    }

    /**
     * 校徽收录查询
     * @param dto 包含分页参数和语言类型的校徽收录查询对象
     * @return AjaxResult 包含校徽收录列表数据和总记录数的响应结果
     * @see com.dnndo.system.domain.vo.SchoolOfficialVO
     * @see com.dnndo.system.domain.vo.SchoolOfficialEnVO
     */
    @PostMapping("/school_badge_official")
    public AjaxResult schoolBadgeOfficial(@RequestBody SchoolOfficialDTO dto) {
        // 将分页参数设置到请求属性中
        HttpServletRequest request = ServletUtils.getRequest();
        request.setAttribute(TableSupport.PAGE_NUM, dto.getPage());
        request.setAttribute(TableSupport.PAGE_SIZE, dto.getSize());
        // 设置请求分页数据
        int total;
        total = schoolService.countSchoolBadgeOfficial(dto);
        List<?> list;
        startPage();
        if (dto.getLanguage().equals("en")) {
            list = BeanDtoVoUtil.listVo(schoolService.schoolBadgeOfficial(dto), SchoolOfficialEnVO.class);
        } else {
            list = BeanDtoVoUtil.listVo(schoolService.schoolBadgeOfficial(dto), SchoolOfficialVO.class);
        }

        HashMap<String, Object> dataMap = new HashMap<>();
        dataMap.put("total", total);
        dataMap.put("data", list);
        return AjaxResult.success(dataMap);
    }

    /**
     * 获取大学相关的所有信息
     * @param dto 包含语言类型的大学信息查询对象
     * @return AjaxResult 包含大学相关信息的响应结果
     * @see com.dnndo.system.domain.dto.ApiSchoolDTO
     */
    @Log(title = "获取大学相关的所有信息/system/school/info", businessType = BusinessType.INSERT)
    @PostMapping("/info")
    public AjaxResult selectSchoolApi(@RequestBody ApiSchoolDTO dto){
        if (dto.getLanguage().equals("en"))
            return AjaxResult.success(schoolService.getSchoolInfoEn(dto));
        else
            return AjaxResult.success(schoolService.getSchoolInfoZh(dto));
    }

}
